#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

/*
任务状态
1. vTaskSuspend 挂起
2. vTaskSuspendAll 挂起所有任务
3. vTaskResume 恢复
4. vTaskResumeAll 恢复所有任务


注意blocking和suspend的区别
blocking会有一个超时时间
suspend不会有超时时间
*/

void myTask1(void *pvParameters)
{
    while (1)
    {
        printf("Task 1 is running\n");
        vTaskDelay(pdMS_TO_TICKS(1000));
        // 在任务 1 内部挂起当前任务
        // vTaskSuspend(NULL);
    }
}

void myTask2(void *pvParameters)
{
    printf("Task2 begin\n");
    // 挂起所有任务，让当前任务不被打扰
    vTaskSuspendAll();
    // 调用了 vTaskSuspendAll，不能在下面调用freeRTOS的任何其他API函数
    // 包括下面的printf也不能，否则无限重启
    // printf("Task2 running\n");
    for (int i = 0; i < 9999; i++)
    {
        for (int j = 0; j < 9999; j++)
        {
            // 长任务会触发看门狗Task watchdog got triggered
            // 长任务需要定时喂狗
        }
    }
    // 恢复所有任务
    xTaskResumeAll();
    printf("Task2 end\n");
    vTaskDelete(NULL);
}

void app_main(void)
{
    TaskHandle_t xTask1, xTask2;
    xTaskCreatePinnedToCore(myTask1, "Task 1", 2048, NULL, 1, &xTask1, 0);
    xTaskCreatePinnedToCore(myTask2, "Task 2", 2048, NULL, 1, &xTask2, 0);
    // vTaskDelay(pdMS_TO_TICKS(3000));
    // // 在任务外部挂起任务 1
    // vTaskSuspend(xTask1);
    // // 恢复任务 1
    // vTaskDelay(pdMS_TO_TICKS(3000));
    // vTaskResume(xTask1);
}
